<template>
  <div class="dashboard-container">
    <div class="app-container">
      <el-card class="tree-card">
        <!-- 用了一个行列布局 -->
        <TreeTools :node-data="titleData" @on-open="toggleAddBox" />
        <!-- 树形菜单 -->
        <el-tree :data="departs" :props="defaultProps">
          <!-- 中间的代码就是插槽内容，用于定制每一行的布局效果 -->
          <!-- 通过作用域插槽定制每一行的布局 -->
          <template v-slot="scope">
            <TreeTools :node-data="scope.data" @on-open="toggleAddBox" @on-success="onSuccess" />
          </template>
        </el-tree>
      </el-card>
    </div>
    <!-- 添加部门 -->
    <!-- 在组件上定义的自定义事件中，$event表示子组件传递的数据，而不是事件对象 -->
    <!-- <AddDept :is-show-dept="isShowDept" @on-close="isShowDept=$event" /> -->
    <!-- <AddDept :is-show-dept="isShowDept" @on-close="toggleAddBox" /> -->
    <!-- .sync修饰符作用：实现父子传值的双向绑定 -->
    <AddDept :operate-flag="operateFlag" :dept-id="currentDeptId" :dlist="dlist" :is-show-dept.sync="isShowDept" @on-success="onSuccess" />
  </div>
</template>

<script>
import TreeTools from './components/TreeTools.vue'
import AddDept from './components/AddDept.vue'
import { reqGetDepartments } from '@/api/departments.js'

export default {
  name: 'Departments',
  components: { TreeTools, AddDept },
  data() {
    return {
      // 操作状态:编辑或者添加
      operateFlag: '',
      // 当前部门id
      currentDeptId: '-1',
      // 控制添加部门弹窗的显示和隐藏
      isShowDept: false,
      // 标题数据
      titleData: {
        name: '江苏传智播客教育科技股份有限公司',
        manager: '负责人',
        root: true,
        id: ''
      },
      // 部门列表的原始数据:普通数组
      dlist: [],
      departs: [
        {
          name: '总裁办',
          manager: '曹操',
          children: [{ name: '董事会', manager: '曹丕' }]
        },
        { name: '行政部', manager: '刘备' },
        { name: '人事部', manager: '孙权' }
      ],
      defaultProps: {
        label: 'name',
        children: 'children'
      }
    }
  },
  created() {
    this.loadDepartmentsList()
  },
  methods: {
    // 控制添加部门的弹窗的打开和关闭
    toggleAddBox(info) {
      this.currentDeptId = info.id
      this.operateFlag = info.type
      this.isShowDept = true
    },
    // 关闭添加部门的弹窗
    // onClose (flag) {
    //   this.isShowDept = flag
    // },
    // // 添加部门打开弹窗
    // onOpen (flag) {
    //   this.isShowDept = flag
    // },
    // 删除成功的回调
    onSuccess() {
      this.loadDepartmentsList()
    },
    // 把普通数组转化为树形结构的数据
    translateListToTreeData(list, id) {
      const result = []
      // list表示原始的列表数据
      // id表示当前节点的id，根据它可以找到他的子节点

      // 遍历list每一个节点，并且找到每一个节点的所有子节点
      // 找到的所有子节点放到数组children中，把children属性赋值给当前节点对象即可
      list.forEach(item => {
        if (item.pid === id) {
          // 查找item当前节点的子节点
          const children = this.translateListToTreeData(list, item.id)
          if (children && children.length > 0) {
            item.children = children
          }
          result.push(item)
        }
      })
      // 返回值表示整个转化后的树形结构
      return result
    },
    // 加载部门列表数据
    async loadDepartmentsList() {
      try {
        const ret = await reqGetDepartments()
        if (ret.code === 10000) {
          // 把后端获取到的原始的部门列表数据传递给【转换函数】，返回最终的树形结构的数据
          this.dlist = ret.data.depts
          this.departs = this.translateListToTreeData(ret.data.depts, '')
          this.titleData.name = ret.data.companyName
        }
      } catch {
        this.$message.error('获取部门列表数据失败')
      }
    }
  }
}
</script>

<style scoped>
.tree-card {
  padding: 30px 30px;
  font-size: 14px;
}
</style>
